/* 
 * File:   scene.cpp
 * Author: chaterolas
 * 
 * Created on 24 de junio de 2009, 10:32 PM
 */

#include "scene.h"

/**
 * Crea una nueva instancia de Scena a partir de las siguientes propiedades :
 * @param name (nombre de esta escena)
 * @param width (ancho de la escena en pixeles)
 * @param height (altura de la escena en pixeles)
 * @param aaPasses ()
 * @param camera (posicion de la camara en la escena)
 */
Scene::Scene(string name, int width, int height, int aaPasses, Camera* camera) {
    sealed = 0;
    w = width;
    h = height;
    aa = aaPasses;
    cam = camera;
    this->name = name;
}

/**
 * Destruye una instancia de escena junto con sus componentes pertinentes
 */
Scene::~Scene() {
    delete cam;
    if(sealed) {
        for(int i = 0; i < num_prim; i++)
            delete primitives[i];

        delete [] primitives;
    }
}


/**
 * Cierra la posibilidad de de agregar mas primitivos a la escena, ademas de que
 * convierte en un arreglo la lista de primitivos actual.
 */
void Scene::seal() {
    sealed = 1;
    num_prim = objs.size();
    primitives = new Primitive *[num_prim];

    for(int i = 0; i < num_prim; i++) {
        primitives[i] = objs.front();
        objs.pop_front();
    }
}

/**
 * Una vez que se ha cerrado la escena, regresa el arreglo que conntine
 * los primitivos de la misma. Regresa nulo si la escena no esta cerrada.
 * @return primitives
 */
Primitive **Scene::getPrimitives() {
    if(sealed)
        return primitives;
    else
        return NULL;
}

/**
 * En el caso de que no se haya cerrado la lista de primitivos, añade un
 * primitiva a esta escena; si esta cerrada no hace nada.
 * @param p (primitvo)
 */
void Scene::addPrimitive(Primitive *p) {
    if(sealed == 0)
        objs.push_front(p);
}

/**
 * Regresa el numero de primitivos con los que cuenta la escena.
 * @retrun num_primitives
 */
int Scene::primitivesCount() {
    if(sealed)
        return num_prim;
    else
        return objs.size();
}

/**
 * Regresa el nombre de esta escena.
 * @return name
 */
string Scene::getName() {
    return name;
}

/**
 * Regresa el numero de muestras que se toman para aplicar el antialiasing
 * en este imagen.
 * @return antialiasing_passes
 */
int Scene::getAAPasses() {
    return aa;
}

/**
 * Regresa la camara desde donde se observa esta escena.
 * @param cam
 */
Camera *Scene::getCamera() {
    return cam;
}

/**
 * Regresa la anchura de esta escena en pixeles.
 * @return width
 */
int Scene::getWidth() {
    return w;
}

/**
 * Regresa la altura de esta escena en pixeles.
 * @return height
 */
int Scene::getHeight() {
    return h;
}

/**
 * Regresa 1 si ya no es posible agragar posible agragar primitivos a la escena,
 * y 0 en caso contrario.
 * @return sealed?
 */
int Scene::isSealed() {
    return sealed;
}

